// ============================================================================
// JSON 字段转换器
// ============================================================================

import { ValueTransformer } from 'typeorm'

/**
 * JSON 字段转换器
 * 用于将对象自动序列化/反序列化为 JSON 字符串
 */
export class JsonTransformer implements ValueTransformer {
  /**
   * 将对象转换为数据库存储的字符串
   */
  to(value: any): string | null {
    if (value === null || value === undefined) {
      return null
    }
    
    try {
      return JSON.stringify(value)
    } catch (error) {
      console.error('JSON序列化失败:', error)
      return null
    }
  }

  /**
   * 将数据库字符串转换为对象
   */
  from(value: string | null): any {
    if (!value) {
      return null
    }
    
    try {
      return JSON.parse(value)
    } catch (error) {
      console.error('JSON反序列化失败:', error)
      return null
    }
  }
}

/**
 * 日期转换器
 * 处理定时任务参数中的日期字段
 */
export class DateTransformer implements ValueTransformer {
  to(value: Date | string | number | null): number | null {
    if (!value) return null
    
    if (value instanceof Date) {
      return value.getTime()
    }
    
    if (typeof value === 'string') {
      const date = new Date(value)
      return isNaN(date.getTime()) ? null : date.getTime()
    }
    
    if (typeof value === 'number') {
      return value
    }
    
    return null
  }

  from(value: number | null): Date | null {
    if (!value) return null
    return new Date(value)
  }
}

/**
 * 定时任务参数转换器
 * 特殊处理定时任务参数中的日期字段
 */
export class ScheduledTaskParamsTransformer implements ValueTransformer {
  to(value: any): string | null {
    if (!value) return null
    
    try {
      // 在序列化前处理日期字段
      const serialized = { ...value }
      if (serialized.lastExecuted instanceof Date) {
        serialized.lastExecuted = serialized.lastExecuted.toISOString()
      }
      if (serialized.nextExecution instanceof Date) {
        serialized.nextExecution = serialized.nextExecution.toISOString()
      }
      
      return JSON.stringify(serialized)
    } catch (error) {
      console.error('定时任务参数序列化失败:', error)
      return null
    }
  }

  from(value: string | null): any {
    if (!value) return null
    
    try {
      const parsed = JSON.parse(value)
      
      // 在反序列化后处理日期字段
      if (parsed.lastExecuted && typeof parsed.lastExecuted === 'string') {
        parsed.lastExecuted = new Date(parsed.lastExecuted)
      }
      if (parsed.nextExecution && typeof parsed.nextExecution === 'string') {
        parsed.nextExecution = new Date(parsed.nextExecution)
      }
      
      return parsed
    } catch (error) {
      console.error('定时任务参数反序列化失败:', error)
      return null
    }
  }
}
